home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / gepackte_disketten / 1993 / 05_93_2.dms / 05_93_2.adf / blitter / Blitter.asm < prev    next >
Assembly Source File  |  1993-03-08  |  6KB  |  325 lines

  1. ***************************************************
  2. *       Blitter Beispielprogramm (8.3.1993)       *
  3. *     von G. Herbold, A. Kochann und O. Reiff     *
  4. *         Assembler: DevPacII           *
  5. *               tabulator size: 11          *
  6. ***************************************************
  7.  
  8. dmablt  = $dff040
  9. bltcon0 = $0
  10. bltcon1 = $2
  11. bltafwm = $4
  12. bltalwm = $6
  13. bltcpth = $8
  14. bltbpth = $c
  15. bltapth = $10
  16. bltaptl = $12
  17. bltdpth = $14
  18. bltsize = $18
  19. bltcmod = $20
  20. bltbmod = $22
  21. bltamod = $24
  22. bltdmod = $26
  23. bltcdat = $30
  24. bltbdat = $32
  25. bltadat = $34
  26. bltddat = $36
  27.  
  28.     move.l    4.w,a6
  29.     lea    intname,a1
  30.     jsr    -408(a6)        openlib
  31.     lea    IntBase,a0
  32.     move.l    d0,(a0)
  33.     move.l    d0,a6
  34.     lea    screens,a0
  35.     jsr    -198(a6)        OpenScreen
  36.     lea    Screen_1,a0
  37.     move.l    d0,(a0)
  38.     beq    NoScreen
  39.     move.l    d0,a0
  40.     add.l    #84,a0        84=Rastport
  41.     lea    RastP1,a1
  42.     move.l    a0,(a1)
  43.     move.l    4.w,a6
  44.     jsr    -132(a6)        Forbid
  45.  
  46. rechteck    bsr    fill
  47.  
  48. .1    btst    #10,$dff016.l    rechte Maustaste
  49.     bne.s    .1
  50.  
  51. rechtecke    lea    aktfarbe(pc),a0
  52.     move.l    #271,d0
  53.     move.l    #169,d1
  54. .2    bsr    copy
  55.     move.b    d0,(a0)
  56.     subq.w    #1,d0
  57.     dbra    d1,.2
  58.  
  59. .3    btst    #10,($dff016).l    rechte Maustaste
  60.     bne.s    .3
  61.  
  62. linien    move.l    #319,d4
  63. .4    move.l    d4,d0
  64.     moveq    #0,d2
  65.     move.b    d4,(a0)
  66.     bsr    line
  67.     dbra    d4,.4
  68.     move.l    #199,d4
  69. .5    move.l    d4,d2
  70.     moveq    #0,d0
  71.     move.b    d4,(a0)
  72.     bsr    line
  73.     dbra    d4,.5
  74.     move.l    #319,d4
  75. .6    move.l    d4,d0
  76.     move.l    #199,d2
  77.     move.b    d4,(a0)
  78.     bsr    line
  79.     dbra    d4,.6
  80.     move.l    #199,d4
  81. .7    move.l    d4,d2
  82.     move.l    #319,d0
  83.     move.b    d4,(a0)
  84.     bsr    line
  85.     dbra    d4,.7
  86.  
  87.     move.l    4.w,a6
  88.     jsr    -138(a6)        Permit
  89.  
  90. Wait    btst    #10,($dff016).l    rechte Maustaste
  91.     bne.s    Wait
  92.  
  93. Ende    move.l    intbase,a6
  94.     move.l    Screen_1,a0
  95.     jsr    -66(a6)        CloseScreen
  96. NoScreen    move.l    4.w,a6
  97.     movea.l    intbase,a1
  98.     jsr    -414(a6)        closelib
  99.     rts
  100.  
  101. *---------------------------------------------
  102. *---------------------------------------------
  103. fill    movem.l    d0-a6,-(sp)
  104.     lea    buffer(pc),a6
  105.     move.w    #$09f0,bltcon0(a6)    AD an
  106.     move.w    #$000e,bltcon1(a6)    IFE,FCI,DESC
  107.     move.w    #$ffff,bltbdat(a6)    Maske
  108.     move.l    #$ffffffff,bltafwm(a6)    
  109.     move.w    #34,bltamod(a6)
  110.     move.w    #34,bltdmod(a6)
  111.     moveq    #30,d7
  112.     lsl.l    #6,d7
  113.     addq.w    #3,d7
  114.     move.w    d7,bltsize(a6)    30*64+3
  115.     move.l    rastp1,a0
  116.     move.l    4(a0),a0        BitMap
  117.     lea    8(a0),a0
  118.     move.l    #1165,d4        Endadresse
  119.     move.l    (a0)+,d7
  120.     add.l    d4,d7
  121.     move.l    d7,bltdpth(a6)
  122.     move.l    d7,bltapth(a6)
  123.     bsr    Startblitter
  124.     movem.l    (sp)+,d0-a6
  125.     bra    Clearblitter
  126. *----------------------------------------------------
  127. copy    movem.l    d0-a6,-(sp)    d0,d1 x,y
  128.     lea    buffer(pc),a6
  129.     moveq    #0,d5
  130.     muls    #40,d1
  131.     move.w    d0,d5
  132.     and.b    #$f0,d5
  133.     sub.w    d5,d0
  134.     lsr.w    #3,d5
  135.     add.l    d1,d5
  136.     ror.w    #4,d0
  137.     move.w    #$0bca,bltcon0(a6)    ACD an, Kopieren
  138.     add.w    d0,bltcon0(a6)    +Verschiebung
  139.     move.l    #$ffffffff,bltafwm(a6)    Maske
  140.     moveq    #30,d7
  141.     lsl.l    #6,d7
  142.     addq.w    #3,d7
  143.     moveq    #34,d1
  144.     tst.w    d0        Verschiebung ?
  145.     beq.s    .1
  146.     subq.w    #2,d1
  147.     addq.w    #1,d7
  148. .1    move.w    d1,bltamod(a6)
  149.     move.w    d1,bltdmod(a6)
  150.     move.w    d1,bltcmod(a6)
  151.     move.w    d7,bltsize(a6)
  152.     moveq    #0,d0
  153.     move.l    rastp1,a0
  154.     move.l    4(a0),a0        BitMap
  155.     move.b    5(a0),d0
  156.     subq.b    #1,d0
  157.     lea    8(a0),a0
  158.     lea    aktfarbe,a5
  159.     move.b    (a5),d1
  160.     move.l    (a0)+,d7
  161.     move.l    d7,d3
  162.     move.l    d3,bltapth(a6)    von 0,0
  163. copyloop2    add.l    d5,d7
  164.     move.l    d7,bltdpth(a6)    nach x,y
  165.     move.l    d7,bltcpth(a6)
  166.     move.w    #$ffff,bltbdat(a6)
  167.     move.l    (a0)+,d7
  168.     move.b    d1,d2
  169.     andi.b    #1,d2
  170.     bne.s    copyein2
  171.     move.w    #0,bltbdat(a6)
  172. copyein2    lsr.b    #1,d1
  173.     bsr    Startblitter
  174.     dbra    d0,copyloop2
  175.     movem.l    (sp)+,d0-a6
  176.     bra    Clearblitter
  177. *-------------------------------
  178. line    movem.l    d0-a6,-(sp)    d0,d1 x d2,d3 y .w
  179.     lea    buffer(pc),a6
  180.     lea    Mittelpunkt,a5
  181.     move.w    (a5)+,d1
  182.     move.w    (a5),d3
  183.     cmp.w    d0,d1
  184.     bgt.s    .02
  185.     beq.s    .01
  186.     exg    d0,d1
  187.     exg    d2,d3
  188.     bra.s    .02
  189. .01    cmp.w    d2,d3
  190.     beq    Lineende
  191. .02    move.l    #-1,bltafwm(a6)    Maske
  192.     cmp.w    d2,d3
  193.     bge.s    .03
  194.     exg    d0,d1
  195.     exg    d2,d3
  196. .03    move.w    d1,d4        d0 dx
  197.     sub.w    d0,d4
  198.     move.w    d3,d6        d6 dy
  199.     sub.w    d2,d6
  200.     moveq    #0,d7        Oktant wird bestimmt
  201.     tst.w    d4
  202.     bpl.s    .06
  203.     neg.w    d4
  204.     cmp.w    d4,d6
  205.     bge.s    .05
  206.     moveq    #5,d7
  207.     bra.s    .07
  208. .05    moveq    #2,d7
  209.     bra.s    .07
  210. .06    cmp.w    d4,d6
  211.     bge.s    .07
  212.     moveq    #4,d7
  213. .07    cmp.w    d4,d6
  214.     bge.s    .08
  215.     exg    d6,d4
  216. .08    add.w    d7,d7        d7 Oktant*4 
  217.     add.w    d7,d7
  218.     addq.w    #1,d7
  219.     add.w    d4,d4        d0 Klein*2
  220.     move.w    d4,bltbmod(a6)    BltBMOD
  221.     sub.w    d6,d4        Klein*2-Gro
  222.     bgt.s    .09
  223.     addi.w    #64,d7
  224. .09    move.w    d4,bltaptl(a6)    Klein*-Gro BltAPtL
  225.     sub.w    d6,d4
  226.     move.w    d4,bltamod(a6)    Klein*2-Gro*2 BltAMOD
  227.     move.w    #$8000,bltadat(a6)    BltADat
  228.     moveq    #40,d4
  229.     move.w    d4,bltcmod(a6)    BltCMod
  230.     move.w    d4,bltdmod(a6)    BltDMod
  231.     lsl.w    #3,d2        Adresse ausrechnen
  232.     move.w    d2,d4
  233.     add.w    d2,d2
  234.     add.w    d2,d2
  235.     add.w    d4,d2
  236.     move.w    d2,d4
  237.     move.w    d0,d2
  238.     lsr.w    #4,d2        Verschiebung(x) ausrechnen
  239.     add.w    d2,d2
  240.     add.w    d2,d4
  241.     lsl.w    #3,d2
  242.     sub.w    d2,d0
  243.     ror.w    #4,d0
  244.     add.w    d0,d7
  245.     move.w    d7,bltcon1(a6)
  246.     move.w    #$bca,bltcon0(a6)    Überschreibt Hintergrund
  247.     or.w    d0,bltcon0(a6)
  248.     addq.w    #1,d6        Länge der Linie +1
  249.     lsl.w    #6,d6
  250.     addq.w    #2,d6
  251.     move.w    d6,bltsize(a6)    BltSize
  252.     ext.l    d4
  253.     moveq    #0,d0
  254.     move.l    rastp1,a0
  255.     move.l    4(a0),a0        BitMap
  256.     move.b    5(a0),d0
  257.     subq.l    #1,d0
  258.     lea    8(a0),a0
  259.     lea    aktfarbe,a5
  260.     move.b    (a5),d1    
  261. lineloop2    move.l    (a0)+,d3
  262.     add.l    d4,d3
  263.     move.l    d3,bltcpth(a6)
  264.     move.l    d3,bltdpth(a6)
  265.     move.w    #$ffff,bltbdat(a6)
  266.     move.b    d1,d2
  267.     andi.b    #1,d2
  268.     bne.s    lineein2
  269.     move.w    #0,bltbdat(a6)
  270. lineein2    lsr.b    #1,d1
  271.     bsr.s    Startblitter
  272.     dbra    d0,lineloop2
  273. Lineende    movem.l    (sp)+,d0-a6
  274.     bra.s    Clearblitter
  275. *----------
  276. Startblitter
  277.     movem.l    d0/a0-a2,-(sp)    Startet den Blitter
  278.     bsr.s    Waitblitter    lädt Bl.-Zwischenspeicher -> DMA
  279.     lea    buffer(pc),a0
  280.     lea    (DMABLT).l,a1
  281.     move.l    a0,a2
  282.     moveq    #5,d0
  283. .01    move.l    (a0)+,(a1)+
  284.     dbra    d0,.01
  285.     addq.l    #8,a0
  286.     addq.l    #8,a1
  287.     move.l    (a0)+,(a1)+
  288.     move.l    (a0)+,(a1)+
  289.     addq.l    #8,a1
  290.     addq.l    #8,a0
  291.     move.l    (a0)+,(a1)+
  292.     move.w    (a0),(a1)
  293.     move.w    $18(a2),$DFF058.l    StartBlitter(BltSize)
  294.     movem.l    (sp)+,d0/a0-a2
  295.     rts
  296. *----------
  297. Waitblitter
  298.     btst.b    #14,$dff002.l
  299.     bne.s    Waitblitter
  300.     rts
  301. *----------
  302. Clearblitter
  303.     movem.l    d0/d1/a0,-(sp)    löscht Blitter-Zwischenspeicher
  304.     lea    buffer(pc),a0
  305.     moveq    #0,d0
  306.     moveq    #13,d1
  307. .01    move.l    d0,(a0)+
  308.     dbra    d1,.01
  309.     movem.l    (sp)+,d0/d1/a0
  310.     rts
  311. *--------------------------------------------------
  312. buffer    ds.b    $3a
  313. Mittelpunkt
  314.     dc.w    100,100
  315. aktfarbe    dc.b    0,0
  316. intname    dc.b    'intuition.library',0
  317. intbase    dc.l    0
  318. rastp1    dc.l    0
  319. Screen_1    dc.l    0
  320. Screens    dc.w    0,0,320,200,6,0,$80,$110f
  321.     dc.l    0,0,0,0,ScreenTags
  322. ScreenTags    dc.l    $80000032,$11080
  323.     dc.l    0
  324.  
  325.